package com.example.demo.bigfileupload.controller;

import com.example.demo.bigfileupload.entity.MultipartFileParam;
import com.example.demo.bigfileupload.entity.UploadResultVo;
import com.example.demo.bigfileupload.service.FileUpDownService;
import com.example.demo.bigfileupload.util.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;


/**
 * 该测试项目实现的功能：文件普通上传、文件分片上传、断点续传、秒传。文件普通上传不谈，这里展开分片逻辑进行讨论。
 *
 * 第一步：前端在进行大文件上传之前，先通过MD5算法（MD5不是加密算法）获取大文件的MD5值（ 每个文件的MD5都不一样），
 * 将MD5值作为参数调用后端秒传检测接口——目的就是在文件上传前判断文件是否已经上传。此步好处->
 *
 *         好处一：如果文件已经上传过，则不用再上传，文件地址复用即可；
 *
 *         好处二：如果大文件是分片上传的，并且因为某些原因，只上传了部分分片，则接口返回已上传的分片信息，
 *         前端可以根据信息判断哪些分片还没有上传，只上传还没有上传的分片即可（断点续传）。
 *
 * 第二步：根据第一步的接口响应信息，判断是否需要进行文件上传。若要上传，调用文件上传接口进行文件或分片文件的上传。
 * （每个分片文件也都需要其MD5值进行校验，分片文件合并在后端自动进行）
 */
@RestController
@RequestMapping("/file")
@Api(tags = "文件分片上传")
public class FileUpDownController {

    @Resource
    private FileUpDownService fileUpDownService;

    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result upload(MultipartFileParam param) {
        UploadResultVo vo;
        if (param.getChunkFlag()) {
            vo = fileUpDownService.chunkUpload(param);
        } else {
            vo = fileUpDownService.singleUpload(param);
        }
        return Result.success(vo);
    }

    @GetMapping("/fastCheck")
    @ApiOperation("文件检查")
    public Result fastCheck(@RequestParam(value = "isChunk") @ApiParam("是否分片") Boolean isChunk,
                            @RequestParam(value = "md5") @ApiParam("文件md5") String md5) {
        UploadResultVo vo = fileUpDownService.fastUploadCheck(isChunk, md5);
        return Result.success(vo);
    }

    @GetMapping("/download")
    @ApiOperation("文件下载")
    public Result download(@RequestParam(value = "fileKid") @ApiParam("文件id") String fileKid) {
        //
        return Result.success();
    }
}
